package utils

type SigDoc struct {
	TLSExpire     int64  `json:"TLS.expire"`
	TLSVer        string `json:"TLS.ver"`
	TLSSdkappid   int64  `json:"TLS.sdkappid"`
	TLSIdentifier string `json:"TLS.identifier"`
	TLSSig        string `json:"TLS.sig"`
	TLSTime       int64  `json:"TLS.time"`
}
type SigDocWithUserBuf struct {
	TLSExpire     int64  `json:"TLS.expire"`
	TLSVer        string `json:"TLS.ver"`
	TLSSdkappid   int64  `json:"TLS.sdkappid"`
	TLSIdentifier string `json:"TLS.identifier"`
	TLSSig        string `json:"TLS.sig"`
	TLSTime       int64  `json:"TLS.time"`
	TLSUserbuf    string `json:"TLS.userbuf"`
}

type AddConferReq struct {
	Theme           string `json:"theme"`           // 会议主题
	Type            int    `json:"type"`            // 会议类型（0：快速会议；1：预定会议）
	Creator         int64  `json:"creator"`         // 会议创建人
	StartTime       string `json:"startTime"`       // 开始时间
	EndTime         string `json:"endTime"`         // 结束时间
	TimeZone        string `json:"timeZone"`        // 时区
	Toplimit        int    `json:"toplimit"`        // 人数上限
	Allow           int    `json:"allow"`           // 是否允许成员在主持人进会前加入会议（0：不允许；1：允许）
	Cycle           int    `json:"cycle"`           // 是否周期性会议(1：周期会议；0：单次会议)
	DisableAudio    int    `json:"disableAudio"`    //入会是否开启静音(0:不开启静音(默认)；1：开启静音；2:超过六人自动开启静音)
	Watermark       int    `json:"watermark"`       //是否开启水印 （0：不开启 1：开启）
	SetPassword     int    `json:"setPassword"`     //是否开启密码 （0：不开启 1：开启）
	MeetingPassword string `json:"meetingPassword"` //会议密码

	CycleType           int    `json:"repetFrequency"`      // 重复频率。0：每天；1：每周一至周五；2：每周；3：每两周；4：每月；5：自定义
	UntilType           int    `json:"endRepetType"`        // 结束重复类型。0：结束于某天; 1：限定会议次数。
	CloseDate           string `json:"closeDate"`           // 周期会议的终止日期
	UntilCount          int    `json:"untilCount"`          // 限定会议的次数
	CustomizedCycleType int    `json:"customFrequencyType"` // 自定义频率类型。0：天； 1：周； 2：月；3。
	CustomizedCycleStep int    `json:"customFrequencyVal"`  // 自定义频率值。1~99（天）；1~12（周、月）
	WeekOrder           int    `json:"weekOrder"`           // 按月以周为颗粒度时，表示发生于第几周
	CustomCycleDays     []int  `json:"customCycleDays"`     // 发生于哪些日期。根据customFrequencyType决定其值的含义
}

type EmediaRoomInfo struct {
	Id       int64
	AppId    int64
	RoomId   string
	ConfrId  string
	Password string
	Record   string
	State    int
}
type RoomInfoCreate struct {
	AppId     int64  `json:"appId"` // 应用id
	Uuid      string // 会议的uuid
	Creator   string // 会议创建人id
	RoomType  string // 房间类型
	ConfrType string // 房间类型。Imme：及时会议；Order：预定会议
	Password  string `json:"password"` // 房间密码
	ConfrId   string // 房间id
	RoomId    string // 房间号
	State     int    // 状态
}

type ConfeUpdate struct {
	Id              int64  `json:"id"`
	GroupId         string `json:"groupId"`
	Theme           string `json:"theme"`
	StartTime       string `json:"startTime"`
	EndTime         string `json:"endTime"`
	Allow           int    `json:"allow"`
	Cycle           int    `json:"cycle"`           // 是否周期性会议(1：周期会议；0：单次会议)
	DisableAudio    int    `json:"disableAudio"`    //入会是否开启静音(0:不开启静音(默认)；1：开启静音；2:超过六人自动开启静音)
	Watermark       int    `json:"watermark"`       //是否开启水印 （0：不开启 1：开启）
	SetPassword     int    `json:"setPassword"`     //是否开启密码 （0：不开启 1：开启）
	MeetingPassword string `json:"meetingPassword"` //会议密码

	CycleType           int    `json:"repetFrequency"`      // 重复频率。 "0"：每天；"1"：每周一至周五；"2"：每周；"3"：每两周；"4"：每月；"5"：自定义
	UntilType           int    `json:"endRepetType"`        // 结束重复类型。"0"：结束于某天; "1"：限定会议次数。
	CloseDate           string `json:"closeDate"`           // 周期会议的终止日期
	UntilCount          int    `json:"untilCount"`          // 限定的会议场次
	CustomizedCycleType int    `json:"customFrequencyType"` // 自定义频率类型。0：天； 1：周； 2：月；3。
	CustomizedCycleStep int    `json:"customFrequencyVal"`  // 自定义频率值。1~99（天）；1~12（周、月）
	WeekOrder           int    `json:"weekOrder"`           // 按月以周为颗粒度时，表示发生于第几周
	CustomCycleDays     []int  `json:"customCycleDays"`     // 发生于哪些日期。根据customFrequencyType决定其值的含义
}

type ConfeRes struct {
	Date      string          `json:"date"`
	ConfeList []ConferenceRes `json:"confeList"`
}

type ConferenceRes struct {
	Id              int64  `json:"id"`
	GroupId         string `json:"groupId"`         // 分组标识
	Type            int    `json:"type"`            // 类型（0：快速会议；1：预定会议）
	Theme           string `json:"theme"`           // 会议主题
	RoomId          string `json:"roomId"`          // 会议号
	State           int    `json:"state"`           // 会议状态（0：待开始；1：进行中； 2：不显示）
	StartTime       string `json:"startTime"`       // 开始时间
	EndTime         string `json:"endTime"`         // 结束时间
	Creator         string `json:"creator"`         // 会议创建人
	Cycle           int    `json:"cycle"`           // 是否周期性会议（1：周期会议；0：单次会议）
	Allow           int    `json:"allow"`           // 是否允许成员先入会（0：不允许；1：允许）
	DisableAudio    int    `json:"disableAudio"`    // 入会是否设置静音
	Watermark       int    `json:"watermark"`       //是否开启水印 （0：不开启 1：开启）
	SetPassword     int    `json:"setPassword"`     //是否设置会议密码 (0:不设置 1：设置)
	MeetingPassword string `json:"meetingPassword"` //会议密码
}

type Confer struct {
	Id          int64    `json:"id"`
	RoomId      string   `json:"roomId"`      // 会议号
	Theme       string   `json:"theme"`       // 会议主题
	StartTime   string   `json:"startTime"`   // 开始时间
	Creator     int64    `json:"creator"`     // 会议创建人id
	PlayUrl     []string `json:"playUrl"`     // 会议录像路径
	RecordCount int      `json:"RecordCount"` // 会议录制次数
}

// 周期会议规则返回结构体
type CycleRule struct {
	Id                  int    `json:"id"`
	GroupId             string `json:"groupId"`             // 分组id
	CycleType           int    `json:"cycleType"`           // 重复频率。 0：每天；1：每周一至周五；2：每周；3：每两周；4：每月；5：自定义
	UntilType           int    `json:"untilType"`           // 结束周期类型。0：结束于某天; 1：限定会议次数。
	UntilDate           string `json:"untilDate"`           // 周期会议的终止日期
	UntilCount          int    `json:"untilCount"`          // 限定的会议次数
	CustomizedCycleType int    `json:"customizedCycleType"` // 自定义周期性会议的循环类型。0：天； 1：周； 2：月，以周为粒度；3：月，以日期为粒度。
	CustomizedCycleStep int    `json:"customizedCycleStep"` // 每[n]（天、周、月）重复
	WeekOrder           int    `json:"weekOrder"`           // 按月以周为颗粒度时，表示发生于第几周
	//CustomCycleDays     []int  `json:"customCycleDays"`     // 发生于哪些日期。根据customizedCycleType决定其值的含义
}

// 用户
type AppUser struct {
	Id             int64  `json:"id"`             // 主键
	Uuid           string `json:"uuid"`           // 用户uuid
	AppId          int64  `json:"appId"`          // 用户所属应用id
	Username       string `json:"username"`       // 名称
	Nickname       string `json:"nickname"`       // 昵称
	PhoneNo        string `json:"phoneNo"`        // 电话号码
	Roles          string `json:"roles"`          // 用户角色
	Password       string `json:"password"`       // 用户密码
	Avatar         string `json:"avatar"`         // 头像的url
	AvatarCircular string `json:"avatarCircular"` // 圆形头像的url
}

// 用户返回结构体
type UserRes struct {
	Id             int64   `json:"id"`             // 主键
	Token          string  `json:"token"`          // 用户token,登录成功后生成的
	Username       string  `json:"username"`       // 名称
	Nickname       string  `json:"nickname"`       // 昵称
	PhoneNo        string  `json:"phoneNo"`        // 电话号码
	Password       string  `json:"password"`       // 密码
	Avatar         string  `json:"avatar"`         // 头像的url
	AvatarCircular *string `json:"avatarCircular"` // 圆形头像的url
}

// 消息数据库对应结构体
type TidingsPO struct {
	Title   string `json:"title"`   // 标题
	Type    int    `json:"type"`    // 业务类型（0：系统通知；）
	BizId   string `json:"bizId"`   // 关联的业务id
	UserId  int64  `json:"userId"`  // 关联的用户id
	Content string `json:"content"` // 显示内容
}

// 消息返回结构体
type TidingsVo struct {
	Id        int    `json:"id"`        // 消息标识
	Title     string `json:"title"`     // 标题
	BizId     string `json:"bizId"`     // 关联的业务标识
	Content   string `json:"content"`   // 显示内容
	View      int    `json:"view"`      // 是否已阅（1：已阅，0：未阅）
	Theme     string `json:"theme"`     // 会议标题
	StartTime string `json:"startTime"` // 会议开始时间
}

// 批量删除消息入参
type TidingsIds struct {
	TidingsIds []int `json:"tidingsIds"`
}

// 参会人员
type RoomPlayers struct {
	Id         int    `json:"id"`         // 主键标识
	AppId      int    `json:"appId"`      // 应用标识
	RoomId     int    `json:"roomId"`     // 房间标识（会议标识）
	PlayerName string `json:"playerName"` // 参会人员名称
	ConfId     string `json:"confId"`     // 会议的confrId
	Password   string `json:"password"`   // 会议密码
	EnterTime  string `json:"enterTime"`  // 进入会议时间
	ExitTime   string `json:"exitTime"`   // 退出会议时间
	PubTime    string `json:"pubTime"`    // 推流时间
	UnPubTime  string `json:"unPubTime"`  // 结束推流时间
	Record     string `json:"record"`     // 录像地址
	CreatedAt  string `json:"createdAt"`  // 创建时间
	UpdatedAt  string `json:"updatedAt"`  // 修改时间
	Version    int    `json:"version"`    // 版本
}

// 批量删除入参
type RPIds struct {
	RoomPlayerIds []string `json:"roomPlayerIds"`
}

type EncryptData struct {
	Encrypt        string `json:"encrypt"`
	EventSignature string `json:"eventSignature"`
	Timestamp      string `json:"timestamp"`
	Nonce          string `json:"nonce"`
	EventType      string `json:"eventType"`
}

type EvtDataReq struct {
	EvtType      string `json:"evtType,omitempty"`
	ConferId     string `json:"confrId,omitempty"`
	MemName      string `json:"memName,omitempty"`
	EvtTimeStamp int64  `json:"evtTimeStamp,omitempty"`
	CallbackArg  string `json:"callbackArg,omitempty"`
	MemExt       string `json:"memExt,omitempty"`
	PubCount     int    `json:"pubCount,omitempty"`
	StreamType   string `json:"streamType,omitempty"`
	StreamId     string `json:"streamId,omitempty"`
	StreamExt    string `json:"streamExt,omitempty"`
	Reason       string `json:"reason,omitempty"`
	PeerMemName  string `json:"peerMemName,omitempty"`
	PlayURL      string `json:"playURL,omitempty"`
	RecType      string `json:"recType,omitempty"`
}
type EvtDataRes struct {
	EvtCallbackUrl    string `json:"evtCallbackUrl"`
	CallbackArg       string `json:"callbackArg"`
	CallbackTimeoutMs int64  `json:"callbackTimeoutMs"`
}

type HisConfeRes struct {
	StartTime    string             `json:"startTime"`
	HisConfeList []HisConferenceRes `json:"confeList"`
}

type HisConfeDetailRes struct {
	Records     []VideoUrls   `json:"videoUrls"`
	UserAvators []UserAvators `json:"attendMembersAvatarUrls"`
}

type VideoUrls struct {
	VideoUrl string `json:"videoUrl"`
	RecordId string `json:"recordId"`
}

type UserAvators struct {
	AvatorUrl *string `json:"avatorUrl"`
}
type HisConferenceRes struct {
	RoomPlayerId   string  `json:"roomPlayerId"`
	RoomPriKey     *string `json:"roomPriId"`
	Id             string  `json:"id"`
	Type           int     `json:"type"`            // 类型（0：快速会议；1：预定会议）
	Theme          string  `json:"theme"`           //会议主题
	RoomId         string  `json:"roomId"`          //会议号
	StartTime      string  `json:"reservStartTime"` //预定开始时间
	EndTime        string  `json:"reservEndTime"`   //预定结束时间
	Creator        *string `json:"initiator"`       // 会议创建人id
	CreatorId      *string `json:"creatorId"`
	CreatorAvator  *string `json:"initiatorAvatarUrl"` // 会议发起人头像
	Cycle          int     `json:"cycle"`              // 是否周期性会议(1：周期会议；0：单次会议)
	ConfCreateTime string  `json:"startTime"`          //会议实际开始时间
	ConfCloseTime  string  `json:"endTime"`            //会议实际结束时间
	RecordFlag     int     `json:"recordFlag"`         //会议录制标识
}

// 会议即将开始通知
type ConfeNotice struct {
	Id        int64  `json:"id"`
	Theme     string `json:"theme"`     // 会议主题
	RoomId    string `json:"roomId"`    // 会议号
	StartTime string `json:"startTime"` // 开始时间
	EndTime   string `json:"endTime"`   // 结束时间
	CreatorId int64  `json:"creatorId"` // 会议创建人标识
	Creator   string `json:"creator"`   // 会议创建人名称
}

type RoomState struct {
	ConfeId         int64  `json:"confeId"` // 房间标识
	Type            int    `json:"type"`    // 类型（0：快速会议；1：预定会议）
	Theme           string `json:"theme"`
	Creator         int64  `json:"creator"`         // 会议创建人标识
	Host            string `json:"host"`            // 会议创建人名称
	State           int    `json:"state"`           // 会议状态（0：初始化；1：创建；2：结束；3：无效；4：）
	Allow           int    `json:"allow"`           // 是否允许成员先入会
	DisableAudio    int    `json:"disableAudio"`    // 入会是否设置静音
	Moderator       int    `json:"moderator"`       //转移的主持人id
	SetPassword     int    `json:"setPassword"`     //是否设置会议密码 (0:不设置 1：设置)
	MeetingPassword string `json:"meetingPassword"` //会议密码
	WhiteBoardFlg   bool   `json:"whiteboardflag"`
}

type RoomInfo struct {
	Id       int64  `json:"id"`
	ConfId   string `json:"confId"`   // media给的会议id
	Password string `json:"password"` // 密码
}
type RoomInfoEx struct {
	Id       int64  `json:"id"`
	ConfId   string `json:"confId"`   // media给的会议id
	Password string `json:"password"` // 密码
	State    int    `json:"state"`
}
type EnterRoomReq struct {
	AppId   int64  `form:"appId" binding:"required"`
	UserId  string `form:"userId" binding:"required"`
	UserSig string `form:"userSig" binding:"required"`
	RoomId  string `form:"roomId" binding:"required"`
}

// 进房反回结构体
type EnterRoomRes struct {
	RoomId   string `json:"roomId"`
	ConfId   string `json:"confId"`
	Password string `json:"password"`
	Ticket   string `json:"ticket"`
}

// 调用media创建房间传参
type CreateConferenceReq struct {
	CallExt           string    `json:"callExt"`        // 扩展用, 客服server传递过来的此字段，MediaService 不做任何修改，将直接发送到 SDK；可用作 客服Server跟SDK间的透传
	MediaType         MediaType `json:"mediaType"`      // 服务类型，如：音频、视频
	CallbackUrl       string    `json:"callbackUrl"`    // 回调地址
	EvtCallbackUrl    string    `json:"evtCallbackUrl"` // rtc推送事件回调地址
	CallbackTimeoutMs int64     `json:"callbackTimeoutMs"`
	// 回调时间, 在 callbackTimeoutMs 毫秒只能, 必须再次回调, 否则 kefu server 认为连接异常,同UpdateStatus.Response.callbackTimeoutMs
	CallbackArg string   `json:"callbackArg"` // 回调参数, media service 不用关心这个, 怎么送过去, 怎么还回来
	Users       []string `json:"users"`       // 用户标识
	Timestamp   int64    `json:"timestamp"`   // 时间戳, 可以用于请求去重
	// Password         string   `json:"password"`         // 会议密码，如果null，media_service会生成一个
	RtcMergedFlag    bool   `json:"rtcMergedFlag"`    // 合并标志，若为false则不用合并
	UserAgent        string `json:"userAgent"`        // 坐席的浏览器信息，默认为null
	UserAgentVisitor string `json:"userAgentVisitor"` // 访客的浏览器信息，默认为null
	Sign             string `json:"sign"`
}

type MediaType int

const (
	video = iota
	audio
)

func (t MediaType) ToString() string {
	switch t {
	case video:
		return "VIDEO"
	case audio:
		return "AUDIO"
	default:
		return "unknown"
	}
}

type DetailReq struct {
	ConferenceId string `json:"conferenceId"`
	Password     string `json:"password"`
}
type TktReq struct {
	ConfrId  string `json:"confrId"`
	Password string `json:"password"`
	MemName  string `json:"memName"`
}
type CreateConferenceRes struct {
	ConfrId  string   `json:"confrId"`
	Password string   `json:"password"`
	Tickets  []string `json:"tickets"`
}

// 从media拿回的证书
type Ticket struct {
	TktId         string `json:"tktId"`
	Url           string `json:"url"`
	InternalUrl   string `json:"internalUrl"`
	ConfrId       string `json:"confrId"`
	Password      string `josn:"password"`
	Type          string `josn:"type"`
	MemName       string `json:"memName"`
	ConfrMemberId string `json:"confrMemberId"`
	Ctx           string `json:"ctx"`
	Hmac          string `json:"hmac"`
	Caller        string `json:"caller"`
	Callee        string `json:"callee"`
	Voff          bool   `json:"voff"`
	Aoff          bool   `json:"aoff"`
	Timestamp     int    `json:"timestamp"`
	Invisible     bool   `json:"invisible"`
	Rights        int    `json:"rights"`
}

type TicketReq struct {
	TktId     string `json:"tktId"`
	Url       string `json:"url"`
	ConfrId   string `json:"confrId"`
	Password  string `json:"password"`
	Type      string `json:"type"`
	MemName   string `json:"memName"`
	Hmac      string `json:"hmac"`
	Timestamp int64  `json:"timestamp"`
	Rights    int    `json:"rights"`
}

type Response struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Data string `json:"data"`
}

// 设置的返回体
type SettingRes struct {
	Id           int64 `json:"id"`
	Cam_state    uint8 `json:"cam_state"`
	Mic_state    uint8 `json:"mic_state"`
	Com_audio    uint8 `json:"com_audio"`
	Min_tray     uint8 `json:"min_tray"`
	Show_speaker uint8 `json:"show_speaker"`
	Show_dur     uint8 `json:"show_dur"`
}

type GetCiphertext struct {
	Data string `json:"data"`
}

type FSContorlMsg struct {
	Data     []string `json:"data"`
	ConferId string   `json:"conferid"`
	Telphone string   `json:"telphone"`
}

type FSSingleContorlMsg struct {
	Data     string `json:"data"`
	ConferId string `json:"conferid"`
	Telphone string `json:"telphone"`
}
type SyncApiCommandMsq struct {
	Command string `json:"command"`
	Arg     string `json:"arg"`
}

type SnedMsg struct {
	Url      string `json:"url"`
	Telphone string `json:"telphone"`
}
type FSContorRsp struct {
	EventMsg map[string]string
}

type NewLoginReq struct {
	PhoneNo       string `json:"phoneno"`
	Type          int32  `json:"type"`
	PassWord      string `json:"password,omitempty"`
	TelVerifyCode string `json:"telvcode,omitempty"`
	CaptchaValue  string `json:"captchaValue,omitempty"`
}

type TelVscodeReq struct {
	PhoneNo string `json:"phoneno"`
	Type    int32  `json:"type"`
}
type ModifyPwdReq struct {
	PhoneNo  string `json:"phone"`
	VCode    string `json:"vcode"`
	PassWord string `json:"password"`
}
type InfoMap struct {
	DataCode string `json:"data_code"`
}
type ParamsMsg struct {
	RsqId    string  `json:"rsqId"`
	BillId   string  `json:"billId"`
	UserName string  `json:"userName"`
	ApiKey   string  `json:"apiKey"`
	Info     InfoMap `json:"infoMap"`
}
type SmsReq struct {
	Params ParamsMsg `json:"params"`
}
type Bean struct {
	Sourceport string `json:"sourceport,omitempty"`
	BillCnt    string `json:"billCnt,omitempty"`
}
type SmsRes struct {
	Sourceport    string `json:"sourceport"`
	BillCnt       string `json:"rtnMsg"`
	Returncode    string `json:"Returncode,omitempty"`
	Returnmessage string `json:"Returnmessage"`
}
type WhiteBoardRecordReq struct {
	RoomId     string `json:"roomId"`
	UserId     string `json:"userId"`
	UploadPath string `json:"uploadPath"`
}
type File struct {
	FileName string `json:"file"`
	Data     string `json:"data"`
}
